home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSMODS / DOTEXT.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  4.8 KB  |  197 lines

  1. /*****************************************************************************/
  2. /* HISTORY:                                     */
  3. /*        setslvlist()                             */
  4. /* 11/10/89  -  dotext()    - Added cpabt = 0;                     */
  5. /*                      Problems resulted in that the routine doesn't  */
  6. /*                  clear the flag if no errors occur, thereby     */
  7. /*                  leaving the old state in the flag.         */
  8. /*****************************************************************************/
  9. #include    <obdefs.h>
  10. #include    <gemdefs.h>
  11. #include    "comp.h"
  12.  
  13. #define        DEBUG        0
  14.  
  15. #define        LBRK        1
  16. #define        SLAVE        2
  17. #define        LBRKSLAVE    3
  18. #define        OUTPUT        4
  19. #define        SLAVEOUTPUT    6
  20. #define        LBRKSLAVEOUTPUT    7
  21.  
  22. /*    Device Type = sdevm    */
  23. #define        DNUM        4    /* number of graphics devices    */
  24. #define        SLOR        0    /* Low    Res    320  x 200     */
  25. #define        SMDR        1    /* Medium Res    640  x 200     */
  26. #define        SHIR        2    /* High   Res    640  x 400    */
  27. #define        PRNT        3    /* Laser  Ptr    2400 x 3180    */
  28.  
  29. extern    unsigned    sdevm;        /* Current device mode        */
  30. extern    unsigned    zrat;        /* Output zoom ratio in 10ths    */
  31. extern     char        cpabt;        /* composition abort flag    */
  32. extern    char        *fend(), *bend(), *malloc();
  33. extern    unsigned long    init_y;
  34. extern    unsigned    init_x;
  35.  
  36. struct slvll    *slv;        /* slave list pointer        */
  37. FDB        *orect_MFDB;    /* output rectangle MFDB    */
  38. int        clip_X0;    /* output rectangle clip X0    */
  39. int        clip_X1;    /* output rectangle clip X1    */
  40. int        clip_Y0;    /* output rectangle clip Y0    */
  41. int        clip_Y1;    /* output rectangle clip Y1    */
  42. static
  43. struct txtattr    savecp;        /* save cp struct for multi-op    */
  44.  
  45. /****************************************************************
  46.             Text Object Handler
  47.     Returns pointer to next text if cpabt is 0 or 8
  48.     else -1L for all other values of cpabt and 0L if
  49.     OUTPUT only is specified.
  50.     cpabt    0    -- no error
  51.         1    -- char has no flash position
  52.         2    -- double floating accent found
  53.         3    -- double space char found
  54.         4    -- line measure too short
  55.         5    -- line break error (no space)
  56.         6    -- text buffer full
  57.         7    -- no memory for slave or tag
  58.         8    -- Hit Region Feed
  59. ****************************************************************/
  60. char    *dotext(text,ptsarray,dmfdb,operation,done)
  61. struct textobj    *text;
  62. int        ptsarray[];
  63. FDB        *dmfdb;
  64. int        operation;
  65. int        *done;
  66. {
  67.     char    *cptr;
  68.  
  69.     cpabt = 0;
  70.     switch(operation) {
  71.     case    LBRK:            /* 1 */
  72.         cptr = fend(text,done);
  73.         break;
  74.     case    SLAVE:            /* 2 */
  75.         setcpXY(ptsarray);
  76.         cptr = bend(text,done);
  77.         break;
  78.     case    OUTPUT:            /* 4 */
  79.         slv = text->slvlist;
  80.         outslave(ptsarray,dmfdb);
  81.         cptr = (char *)0L;
  82.         break;
  83.     case    LBRKSLAVE:        /* 3 */
  84.     case    LBRKSLAVEOUTPUT:    /* 7 */
  85.         f_move(&cp,&savecp,sizeof(cp));    /* save cp for bend()    */
  86.         cptr = fend(text,done);
  87.         if (!cpabt || cpabt == 4 || cpabt == 8)
  88.             f_move(&savecp,&cp,sizeof(cp));    /* restore cp..    */
  89.         else    break;
  90.     case    SLAVEOUTPUT:        /* 6 */
  91.         setcpXY(ptsarray);
  92.         cptr = bend(text,done);
  93.         if (operation != LBRKSLAVE) {    /* if output required    */
  94.             if (!cpabt || cpabt == 4 || cpabt == 8)
  95.                 outslave(ptsarray,dmfdb);
  96.         }
  97.         break;
  98.     }
  99.     return(cptr);
  100. }
  101.  
  102. outslave(ptsarray,dmfdb)
  103. int    ptsarray[];
  104. FDB    *dmfdb;
  105. {
  106.     orect_MFDB = dmfdb;
  107.     zrat = ptsarray[8];
  108.     if (ptsarray[10]) {
  109.         clip_X0 = ptsarray[11];
  110.         clip_Y0 = ptsarray[12];
  111.         clip_X1 = ptsarray[13];
  112.         clip_Y1 = ptsarray[14];
  113.     }
  114.     else {
  115.         clip_X0 = 0;
  116.         clip_Y0 = 0;
  117.         clip_X1 = dmfdb->fd_w;
  118.         clip_Y1 = dmfdb->fd_h;
  119.     }
  120.     if (sdevm == PRNT)
  121.         newdev(1);
  122.     show_slv();
  123.     if (sdevm == PRNT)
  124.         newdev(0);
  125. }
  126.  
  127. setcpXY(ptsarray)
  128. int    ptsarray[];
  129. {
  130.     init_x    = ptsarray[0];
  131.     init_y    = *((unsigned long *)(ptsarray + 1));
  132. }
  133.  
  134. struct slvll    *getslvbuf()
  135. {
  136.     struct slvll    *slvptr;
  137.  
  138.     if (!(slvptr = (struct slvll *)malloc(sizeof(struct slvll))))
  139.         {
  140.         IF_close();
  141.         IF_open(0);
  142.         if (!(slvptr = (struct slvll *)malloc(sizeof(struct slvll))))
  143.              return(0L);
  144.         }
  145.  
  146.     if (!(slvptr->bufptr = malloc(UTSIZE)))
  147.         {
  148.          IF_close();
  149.          IF_open(0);
  150.          if (!(slvptr->bufptr = malloc(UTSIZE)))
  151.              {
  152.         free(slvptr);
  153.         return(0L);
  154.          }
  155.     }
  156.     slvptr->fptr = (struct slvll *)0L;
  157.     return(slvptr);
  158. }
  159.  
  160. setslvlist(text)
  161. struct    textobj *text;
  162. {
  163.     struct    slvll    *nslv;
  164.  
  165.     cpabt = 0;
  166.     if (text->slvlist) {
  167.         slv = text->slvlist;        /* set to begin list    */
  168.         while (slv->fptr)        /* not end of list...    */
  169.             slv    = slv->fptr;
  170.         if (!(nslv = getslvbuf()))    /* get new list member    */
  171.             cpabt = 7;
  172.         else {
  173.             slv->fptr = nslv;    /* add member to list    */
  174.             slv    = nslv;
  175.         }
  176.     }
  177.     else
  178.     if (!(slv = getslvbuf()))
  179.         cpabt = 7;
  180.     else    text->slvlist = slv;
  181. }
  182.  
  183. freeslvlist(slvlist)
  184. struct    slvll    *slvlist;
  185. {
  186.     struct    slvll    *slvptr = slvlist;
  187.  
  188.     if (slvptr != (struct slvll *)0L)
  189.       for (; ;) {
  190.         free(slvptr->bufptr);
  191.         free(slvptr);
  192.         if (slvptr->fptr == (struct slvll *)0L)
  193.             break;
  194.         else    slvptr = slvptr->fptr;
  195.       }
  196. }
  197.